package com.party.core.service.mall.impl;

import com.google.common.base.Strings;
import com.party.common.paging.Page;
import com.party.core.dao.read.mall.MallProductReadDao;
import com.party.core.dao.write.mall.MallProductWriteDao;
import com.party.core.model.BaseModel;
import com.party.core.model.mall.MallProduct;
import com.party.core.model.mall.MallProductOutput;
import com.party.core.service.mall.IMallProductService;
import com.sun.istack.NotNull;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 商城产品服务接口
 * Created by wei.li
 *
 * @date 2017/8/15 0015
 * @time 16:42
 */

@Service
public class MallProductService implements IMallProductService {

    @Autowired
    private MallProductReadDao mallProductReadDao;

    @Autowired
    private MallProductWriteDao mallProductWriteDao;

    /**
     * 商城产品插入
     *
     * @param mallProduct 商城产品
     * @return 插入编号
     */
    @Override
    public String insert(MallProduct mallProduct) {
        BaseModel.preInsert(mallProduct);
        boolean result = mallProductWriteDao.insert(mallProduct);
        if (result) {
            return mallProduct.getId();
        }
        return null;
    }

    /**
     * 更新商城产品
     *
     * @param mallProduct 商城产品
     * @return 更新结果（true/false）
     */
    @Override
    public boolean update(MallProduct mallProduct) {
        mallProduct.setUpdateDate(new Date());
        return mallProductWriteDao.update(mallProduct);
    }

    /**
     * 逻辑删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean deleteLogic(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return mallProductWriteDao.deleteLogic(id);
    }

    /**
     * 物理删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean delete(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return mallProductWriteDao.delete(id);
    }

    /**
     * 批量逻辑删除
     *
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDeleteLogic(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return mallProductWriteDao.batchDeleteLogic(ids);
    }

    /**
     * 批量物理删除
     *
     * @param ids 主键集合
     * @return 删除结果
     */
    @Override
    public boolean batchDelete(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return mallProductWriteDao.batchDelete(ids);
    }

    /**
     * 获取商城商品
     *
     * @param id 主键
     * @return 商城商品
     */
    @Override
    public MallProduct get(String id) {
        return mallProductReadDao.get(id);
    }

    /**
     * 分页查询
     *
     * @param mallProduct 商城商品
     * @param page        分页信息
     * @return 列表
     */
    @Override
    public List<MallProduct> listPage(MallProduct mallProduct, Page page) {
        return mallProductReadDao.listPage(mallProduct, page);
    }

    /**
     * 所有商城商品
     *
     * @param mallProduct 商城产品
     * @return 列表
     */
    @Override
    public List<MallProduct> list(MallProduct mallProduct) {
        return mallProductReadDao.listPage(mallProduct, null);
    }

    @Override
    public MallProductOutput getProductById(String productId) {
        return mallProductReadDao.getProductById(productId);
    }

    @Override
    public String getPrice(List<MallProduct> products) {
        List<Float> prices = (List<Float>) CollectionUtils.collect(products, input -> {
            MallProduct mm = (MallProduct) input;
            return mm.getPrice();
        });
        Float min = Collections.min(prices); // 最小票价
        Float max = Collections.max(prices); // 最大票价
        if (min.equals(max)) {
            if (min.equals(Float.valueOf("0.0"))) {
                return "0";
            }
            return min.toString();
        } else {
            if (min.equals(Float.valueOf("0.0"))) {
                return "0" + "~" + max.toString();
            }
            return min.toString() + "~" + max.toString();
        }
    }

    /**
     * @param ids         主键集合
     * @param mallProduct
     * @param page        分页信息
     * @return
     */
    @Override
    public List<MallProduct> batchList(@NotNull Set<String> ids, MallProduct mallProduct, Page page) {
        return null;
    }


    /**
     * 检查该产品是否还有库存
     *
     * @param productId 产品id
     * @param quantity  数量
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public synchronized boolean hasStock(String productId, Integer quantity) {
        MallProduct product = this.get(productId);
        if (product.getRealStock() >= quantity) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public List<MallProduct> findByGoodsId(String goodsId) {
        MallProduct mallProduct = new MallProduct();
        mallProduct.setGoodsId(goodsId);
        mallProduct.setDelFlag(BaseModel.DEL_FLAG_NORMAL);
        return mallProductReadDao.listPage(mallProduct, null);
    }

    @Override
    public void deleteByGoodsId(String goodsId) {
        mallProductWriteDao.deleteByGoodsId(goodsId);
    }
}
